import moment from 'moment'
import JSZip from 'jszip'
import FileSaver from 'file-saver'
import { VITE_APP_IMAGE_BASE_URL } from '@/utils/base';
import { transformlat, transformlng } from '@/utils/coordinate';
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';
import { exportWord } from '@/utils/exportWordDocx';

// 处理视频
export function getIncludeType(url: any) {
  return url.includes('.mp4')
}

export function formatMillisecondsToDate(ms: number) {
  // 将毫秒转换为moment对象
  let dateObject = moment(ms);

  // 格式化日期和时间
  let formattedDate = dateObject.format("YYYY-MM-DD HH:mm:ss");

  // 返回格式化后的字符串
  return formattedDate;
}

/**
 * 获取初始化3天前到现在时间
 * @param {*} 
 */
export function getInitialDate() {
  // 获取当前日期
  let now = moment();

  // 获取3天前的日期作为开始时间
  // let threeDaysAgo = now.clone().subtract(3, 'days'); // 表示当前时分秒的3天
  let threeDaysAgo = now.clone().subtract(3, 'days').startOf('day');  // 表示0点时分秒的3天

  // 输出开始和结束日期
  let startDate = threeDaysAgo.format('YYYY-MM-DD HH:mm:ss');
  let endDate = now.format('YYYY-MM-DD HH:mm:ss');

  console.log("Start Date: ", startDate);
  console.log("End Date: ", endDate);

  // 如果你要的是整个日期范围数组，可以这样创建
  // let dateRange = [threeDaysAgo.clone(), now];
  // 或者格式化后的字符串数组
  let formattedDateRange = [startDate, endDate];
  return formattedDateRange
}

/**
 * 角度转方向
 * @param {*} 
 */
export function toCompassDirection(angle: number) {
  // 规范化角度至0-360度范围内
  angle = ((angle % 360) + 360) % 360;

  var directions = ['北', '东北', '东', '东南', '南', '西南', '西', '西北'];
  var directionIntervals = [0, 45, 90, 135, 180, 225, 270, 315]; // 直接计算整数角度便于比较

  for (var i = 0; i < directions.length; i++) {
    if (angle >= directionIntervals[i] && angle < directionIntervals[(i + 1)]) {
      return directions[i];
    }
  }

  // 如果没有找到匹配的方向，则返回一个默认方向，例如“未知”
  return '未知';
}


/**
 * 生成报告评估
 * @param {*} 
 */
export function exportWordDocx(wordData: any){
  exportWord(wordData)
}

/**
 * html转图片
 * @param {*} id: string, 
 */
export async function generateImg(id: string = 'content-to-export', type = 'png') {
  const element = document.getElementById(id); // 获取你想要转换为PDF的HTML元素
  if (!element){
    return
  }
  // 使用html2canvas将HTML内容转换为 canvas
  const canvas = await html2canvas(element);
  // 将canvas转换为图像数据URL
  const imgData = await canvas.toDataURL('image/png');
  return imgData
  // console.log(imgData)
  // 初始化一个新的jsPDF文档
  // const doc = new jsPDF();

  // // 将图像数据添加到PDF文档
  // doc.addImage(imgData, 'PNG', 10, 10, 100, 100); // (x, y) 是图片在PDF中的位置

  // // 保存PDF文件
  // doc.save('output.pdf');
  
}

/**
 * 转换地图数据格式
 * @param {*} wgLon: any, 
 * @param {*} wgLat: any
 */
export function transform(wgLon: any, wgLat: any) {
  var a = 6378245.0;
  var ee = 0.00669342162296594323;
  var pi = 3.14159265358979324;
  var dLat = transformlat(wgLon - 105.0, wgLat - 35.0);
  var dLon = transformlng(wgLon - 105.0, wgLat - 35.0);
  var radLat = wgLat / 180.0 * pi;
  var magic = Math.sin(radLat);
  magic = 1 - ee * magic * magic;
  var sqrtMagic = Math.sqrt(magic);
  dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  var mgLat = wgLat + dLat;
  var mgLon = wgLon + dLon;
  return [mgLon, mgLat];
}

/**
 * json 反序列化
 * @param {*} obj
 */
export function parseJsonFields(obj: any) {
  for (let key in obj) {
    if (typeof obj[key] === 'string' && (obj[key].startsWith('{') || obj[key].startsWith('['))) {
      try {
        obj[key] = JSON.parse(obj[key]);
      } catch (error) {
        console.error(`转换错误:`, error);
      }
    }
  }

  return obj;
}

/**
 * 清空对象
 * @param {*} formData
 */
export function clearFormData(formData: any = {}) {
  for (const key in formData) {
    // if (Object.prototype.hasOwnProperty.call(formData, key)) {
    //   delete formData[key];
    // }
    delete formData[key];
  }
  return formData
}


/**
 * 转换数组格式为json格式
 * @param {*} dataObj
 */
export function getObjJson(dataObj: any = {}) {
  const keysList = Object.keys(dataObj)
  keysList.forEach((ele) => {
    if (Array.isArray(dataObj[ele]) || Object.prototype.toString.call(dataObj[ele]) === '[object Object]') {
      dataObj[ele] = JSON.stringify(dataObj[ele])
    }
  })
  return dataObj
}


/**
 * 获取含有Gmt时间的列表
 * @param {*} list 列表
 * @param key
 */
export function getAllGmtTimeList(list = []) {
  list.forEach((ele: any) => {
    ele.beginTime ? ele.beginTime = changeFormat(ele.beginTime) : ''
    ele.endTime ? ele.endTime = changeFormat(ele.endTime) : ''
    ele.createTime ? ele.createTime = changeFormat(ele.createTime) : ''
    ele.lastUpdateTime ? ele.lastUpdateTime = changeFormat(ele.lastUpdateTime) : ''
    if (ele.beginTime && ele.endTime) {
      ele.beginEndTime = [ele.beginTime, ele.endTime]
    }
  })
  return list
}

/**
 * 递归树
 * @param {*} data 文件名
 * @param {*} pid 父级id
 * @param key
 */
export function tree(data: Array<any> = [], pid = 0, key = 'parentId') {
  const result = [];
  // eslint-disable-next-line no-restricted-syntax
  for (const i in data) {
    if (data[i][key] === pid) {
      const temp = data[i];
      const children = tree(data, data[i].id, key);
      if (children.length) {
        temp.children = children;
      }
      result.push(temp);
    }
  }

  return result;
}

/**
 * CST时间转化为GMT标准时间格式
 * @param {*} cts CST时间
 * @param key
 */
export function changeFormat(cts: string) {
  if (null === cts || "" === cts) {
    return "";
  }
  let dateStr = cts.trim().split(" ");
  let strGMT = dateStr[0] + " " + dateStr[1] + " GMT+0800";
  let date = new Date(Date.parse(strGMT));
  //moment.js是一个时间插件，比手动转化格式舒服多了
  return moment().format("YYYY-MM-DD HH:mm:ss")
}

/**
 * 给字典列表添加label统一
 * @param {*} list 列表
 */
export function getDictLabel(list = [], key: any = 'name') {
  if (list && list.length) {
    list.forEach((ele: any) => {
      ele.label = ele[key]
    })
    return list
  }
  return []
}

/**
 * a标签下载文件工具
 * @param {*} url 地址
 * @param {*} name 名称
 */
export async function aDownloadHref(params: any = {}) {
  let { arrList, name = '文件下载' } = params;
  const zip = new JSZip();
  const cache: any = {};
  const promises: any = [];

  for (let item of arrList) {
    console.log(item.url);
    const promise = fetch(item.url).then(response => {
      return response.blob();
    }).then(data => {
      const lst = item.url.split('.');
      const fileType = lst[lst.length - 1];
      zip.file(item.name, data, { binary: true });
      cache[item.name] = data;
    });
    promises.push(promise);
  }

  await Promise.all(promises);

  const content = await zip.generateAsync({ type: 'blob' });
  FileSaver.saveAs(content, `${name}.zip`);
}

/**
 * a标签下载文件工具
 * @param {*} url 地址
 * @param {*} name 名称
 */
export function aDownloadFile(params: any = {}) {
  let { url, noIp = false, name } = params
  if (!name) {
    name = url
  }
  let a = document.createElement('a')
  // 设置隐藏
  a.style.display = 'none'
  // 给a标签地址 主要http:// 手动添加
  if(noIp) {
    a.href = url
  }else {
    a.href = `${VITE_APP_IMAGE_BASE_URL}${url}`
  }
  console.log(a, `http://${VITE_APP_IMAGE_BASE_URL}${url}`)
  // 设置属性download和值，这是个特殊属性，设置名称参照图 3 
  a.download = name
  // 把a标签放入body，创建后的 a 标签，形如图 4
  document.body.appendChild(a)
  // 调用手动点击事件，相当于你做了一次点击
  a.click()
  // 释放该文件引用地址，当你结束使用某个 URL 对象之后，应该调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了(如果该页面有很多文件通过这种方法下载，这一步清理引用对性能优化尤为重要)
  window.URL.revokeObjectURL(url)
  // 移除a标签
  document.body.removeChild(a)
}


/**
 * 倒计时
 * @param num  秒数
 */
export function valTime(num = 60) {
  const timeNum = ref(num)
  let timer: any = null
  const tolNum = num
  function setTime() {
    if (timer) {
      clearInterval(timer)
    }
    timer = setInterval(() => {
      if (timeNum.value > 0 && timeNum.value <= tolNum) {
        timeNum.value--
      } else {
        resetTime()
      }
    }, 1000)
    
  }
  function resetTime() {
    // 重置
    timeNum.value = tolNum
    clearInterval(timer)
  }
  return { setTime, resetTime, timeNum, tolNum }
}

export async function resizeImageToBlob(file: any, width = 400) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = async (e) => {
      const img: any = new Image();
      img.src = e.target?.result;

      img.onload = () => {
        const canvas = document.createElement('canvas');
        canvas.width = width;
        canvas.height = width;
        const ctx = canvas.getContext('2d');

        ctx?.drawImage(img, 0, 0, canvas.width, canvas.height);
        
        canvas.toBlob((blob) => {
          if (!blob) {
            reject('Failed to create Blob from canvas.');
            return;
          }
          
          // 使用原文件名和类型创建新的 File 对象
          const resizedFile = new File([blob], file.name, { type: file.type });
          resolve(resizedFile);
        }, 'image/png', 0.92); // 确保MIME类型与您的需求匹配
      };

      img.onerror = (error: any) => {
        reject(`Image load error: ${error}`);
      };
    };

    reader.onerror = (error: any) => {
      reject(`File read error: ${error}`);
    };

    // 读取原始文件为 Data URL
    reader.readAsDataURL(file);
  });
}